/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gestionnaire;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import modeles.age;
import modeles.jeu;
import modeles.categorie;
import modeles.tag;

/**
 *
 * @author elo
 */
@Stateless
public class gestionnaireJeu {
    @EJB
    private gestionnaireTag gestionnaireTag;
    @EJB
    private gestionnaireCategorie gestionnaireCategorie;
    @EJB
    private gestionnaireAge gestionnaireAge;
    
    @PersistenceContext
    private EntityManager em;

    private String fichier = "jeux.xml";

    public void creerJeux() {
        if(countJeux() == 0){
            chargerJeux();
        }
    }

    public jeu creeJeu(int numero, String nom, String editeur, String description, float prix, Collection<String> listeImg, Collection<age> ageJeux, Collection<categorie> listeCat, Collection<tag> listeTag, float note, String video, int consultation, int nbvote) {
        jeu a = new jeu(numero,nom,editeur,description,prix,listeImg,ageJeux,listeCat,listeTag, note, video, consultation, nbvote);
        em.persist(a);
        return a;
    }

    public Collection<jeu> getAllJeux() {
        // Exécution d'une requête équivalente à un select *
        Query q = em.createQuery("select j from jeu j");
        return q.getResultList();
    }

    public Collection<jeu> getAllJeuxOrderBy(String order) {
        // Exécution d'une requête équivalente à un select *
        Query q = em.createQuery("select j from jeu j order by j."+order);
        return q.getResultList();
    }

    public Collection<jeu> getMieuxNotes(){
        Query q = em.createQuery("select j from jeu j order by j.note desc");
        q.setFirstResult(0);
        q.setMaxResults(3);
        return q.getResultList();
    }

    public Collection<jeu> getPlusConsultes(){
        Query q = em.createQuery("select j from jeu j order by j.consultation desc");
        q.setFirstResult(0);
        q.setMaxResults(3);
        return q.getResultList();
    }

    public Collection<jeu> getDerniersListe(){
        Query q = em.createQuery("select j from jeu j order by j.numero desc");
        q.setFirstResult(0);
        q.setMaxResults(3);
        return q.getResultList();
    }

    public jeu getJeuById(int id){
        Query q = em.createQuery("select j from jeu j where j.id=:id");
        q.setParameter("id", id);
        Collection<Object> result = q.getResultList();
        if(result.size() == 0)
            return null;
        else
            return (jeu)result.toArray()[0];
    }

    public Collection<String> getAllEditeurs() {
        Query q = em.createQuery("select distinct j.editeur from jeu j order by j.editeur asc");
        return q.getResultList();
    }

    public Collection<jeu> getJeuxByCat(int id) {
        Query q = em.createQuery("select j from jeu j, in(j.listeCat) c where c.id = :id");
        q.setParameter("id", id);
        return q.getResultList();
    }

    public Collection<jeu> getJeuxByNomCat(String nom, int idcat) {
        String query = "select j from jeu j";
        if(idcat != -1)
            query += ", in(j.listeCat) c where c.id = :id";
        if(idcat != -1 && !nom.equals(""))
            query += " and lower(j.nom) like '%" + nom.toLowerCase() + "%'";
        if(idcat == -1 && !nom.equals(""))
            query += " where lower(j.nom) like '%" + nom.toLowerCase() + "%'";
        Query q = em.createQuery(query);
        if(idcat != -1)
            q.setParameter("id", idcat);       
        return q.getResultList();
    }

    public Collection<jeu> getJeuxByTag(int id) {
        Query q = em.createQuery("select j from jeu j, in(j.listeTag) c where c.id = :id");
        q.setParameter("id", id);
        return q.getResultList();
    }

    public Collection<jeu> getJeuxByRechercheDetail(String nomJeu, int idCat, int idTag, String editeur, int prix) {

        String query = "select j from jeu j";

        //Si on a une catégorie sélectionée
        if (idCat != -1) {
            //Si un tag est selectionné
            if (idTag != -1) {
                query += ", in(j.listeCat) c, in(j.listeTag) t where c.id = :id and t.id = :idTag";
            }
            else {
                query += ", in(j.listeCat) c where c.id = :id";
            }
            if (!nomJeu.equals("") || !editeur.equals("") || prix != -1) {
                query += " and";
            }
        }

        //Si on a pas de catégorie selectionnée
        else {
            // Mais qu'un tag est selectionné
            if (idTag != -1) {
                query += ", in(j.listeTag) t where t.id = :idTag";
                if (!nomJeu.equals("") || !editeur.equals("") || prix != -1) {
                    query += " and";
                }
            }
            // Sinon c'est le cas ou aucun tag et catégorie sont selectionnés
            else {
                //Si l'un des champs restants est rempli
                if (!nomJeu.equals("") || !editeur.equals("") || prix != -1) {
                    query += " where";
                }
            }
        }
        
System.out.println(query);
        if (!nomJeu.equals("")) {
            query += " lower(j.nom) like '%" + nomJeu.toLowerCase() + "%'";
        }
System.out.println(query);
        if (!editeur.equals("")) {
            if (!nomJeu.equals("")) {
                query += " and";
            }
            query += " lower(j.editeur) like :editeur";
        }
System.out.println(query);
        if (prix != -1) {
            if (!editeur.equals("") || !nomJeu.equals("")) {
                query += " and";
            }
            if (prix == 1) {
                query += " j.prix < 30";
            }

            if (prix == 2) {
                query += " j.prix > 30 and j.prix < 60";
            }

            if (prix == 3) {
                query += " j.prix > 60";
            }
        }
System.out.print(query);
        Query q = em.createQuery(query);

        if (idCat != -1) {
            q.setParameter("id", idCat);
        }
        if (idTag != -1) {
            q.setParameter("idTag", idTag);
        }
        if(!editeur.equals("")){
            q.setParameter("editeur", editeur.toLowerCase());
        }
        return q.getResultList();
    }

    public int countJeux() {
        Query q = em.createQuery("select count(j) from jeu j");
        int nb = Integer.parseInt(q.getSingleResult().toString());
        return nb;
    }

    public void nouvelleConsultation(jeu j){

        j.setConsultation(j.getConsultation()+1);

        Query q = em.createQuery("update jeu u set u.consultation = :consultation where u.id = :id");
        q.setParameter("id", j.getId());
        q.setParameter("consultation", j.getConsultation());
        q.executeUpdate();

        //modification dans le fichier
         try{
             //lecture du fichier
            BufferedReader ficTexte = new BufferedReader(new InputStreamReader(gestionnaireJeu.class.getResourceAsStream(fichier)));
           
            String ligne = "";
            Boolean find = false;
            String texte = "";
            if (ficTexte == null) {
		throw new FileNotFoundException("Fichier non trouvé" );
            }
            ligne = ficTexte.readLine();
            if (ligne != null) {
                do{
                do{                  
                    if(ligne.startsWith("<numero>")){
                        int numero = Integer.valueOf(ligne.substring(8,ligne.indexOf("</numero>")));
                        if(numero == j.getNumero())
                            find = true;
                        texte += ligne+System.getProperty("line.separator");
                    }                  
                    else if(ligne.startsWith("<consultation>")){
                        if(find){
                            texte += "<consultation>"+j.getConsultation()+"</consultation>"+System.getProperty("line.separator");
                            find = false;
                        }
                        else{
                            texte += ligne+System.getProperty("line.separator");
                        }
                    }
                    else{
                        texte += ligne+System.getProperty("line.separator");
                    }
                    ligne = ficTexte.readLine();

                }while(!ligne.equals("</jeu>"));
                    texte += "</jeu>"+System.getProperty("line.separator");
                ligne = ficTexte.readLine();
                }while(ligne != null);
            }
            ficTexte.close();

            //ecriture dans le fichier
            File f;
            URL url = gestionnaireJeu.class.getResource(fichier);
            try {
              f = new File(url.toURI());
            } catch(URISyntaxException e) {
              f = new File(url.getPath());
            }
            BufferedWriter writer = new BufferedWriter(new FileWriter(f));
            writer.write(texte);
            writer.close();
            
        }catch(Exception e){
            System.out.println("erreur");
        }
    }

    public void voter(jeu j, int note){

        float nvNote = ((j.getNote()*j.getNbvote())+note)/(j.getNbvote()+1);

        j.setNbvote(j.getNbvote()+1);
        j.setNote(nvNote);
        
        Query q = em.createQuery("update jeu u set u.nbvote = :nbvote, u.note = :note where u.id = :id");
        q.setParameter("id", j.getId());
        q.setParameter("nbvote", j.getNbvote());
        q.setParameter("note", j.getNote());
        q.executeUpdate();

        //modification dans le fichier
         try{
             //lecture du fichier
            BufferedReader ficTexte = new BufferedReader(new InputStreamReader(gestionnaireJeu.class.getResourceAsStream(fichier)));

            String ligne = "";
            Boolean find = false;
            String texte = "";
            if (ficTexte == null) {
		throw new FileNotFoundException("Fichier non trouvé" );
            }
            ligne = ficTexte.readLine();
            if (ligne != null) {
                do{
                do{
                    if(ligne.startsWith("<numero>")){
                        int numero = Integer.valueOf(ligne.substring(8,ligne.indexOf("</numero>")));
                        if(numero == j.getNumero())
                            find = true;
                        texte += ligne+System.getProperty("line.separator");
                    }
                    else if(ligne.startsWith("<note>")){
                        if(find){
                            texte += "<note>"+j.getNote()+"</note>"+System.getProperty("line.separator");
                        }
                        else{
                            texte += ligne+System.getProperty("line.separator");
                        }
                    }
                    else if(ligne.startsWith("<nbvote>")){
                        if(find){
                            texte += "<nbvote>"+j.getNbvote()+"</nbvote>"+System.getProperty("line.separator");
                        }
                        else{
                            texte += ligne+System.getProperty("line.separator");
                        }
                    }
                    else{
                        texte += ligne+System.getProperty("line.separator");
                    }
                    ligne = ficTexte.readLine();

                }while(!ligne.equals("</jeu>"));
                    if(find)
                        find=false;
                    texte += "</jeu>"+System.getProperty("line.separator");
                ligne = ficTexte.readLine();
                }while(ligne != null);
            }
            ficTexte.close();

            //ecriture dans le fichier
            File f;
            URL url = gestionnaireJeu.class.getResource(fichier);
            try {
              f = new File(url.toURI());
            } catch(URISyntaxException e) {
              f = new File(url.getPath());
            }
            BufferedWriter writer = new BufferedWriter(new FileWriter(f));
            writer.write(texte);
            writer.close();

        }catch(Exception e){
            System.out.println("erreur");
        }
    }

    public void chargerJeux(){
        try{
            //BufferedReader ficTexte = new BufferedReader(new FileReader(new File(fichier)));
            BufferedReader ficTexte = new BufferedReader(new InputStreamReader(gestionnaireJeu.class.getResourceAsStream(fichier)));          
            String ligne = "";
            String temp = "";
            String[] tab;
            String nom = "";
            String editeur = "";
            String description = "";
            String video = "";
            int numero = 0;
            float note = 0.0f;
            int nbvote = 0;
            float prix = 0.0f;
            int consultation = 0;
            Collection<age> a = null;
            Collection<categorie> c = null;
            Collection<tag> t = null;
            Collection<String> img = null;
            
            if (ficTexte == null) {
		throw new FileNotFoundException("Fichier non trouvé" );
            }         
            ligne = ficTexte.readLine();
            if (ligne != null) {

                do{
                do{
                    if(ligne.equals("<jeu>"))
                        ligne = ficTexte.readLine();
                    else if(ligne.startsWith("<nom>")){
                        nom = ligne.substring(5,ligne.indexOf("</nom>"));
                        ligne = ficTexte.readLine();
                    }
                    else if(ligne.startsWith("<numero>")){
                        numero = Integer.valueOf(ligne.substring(8,ligne.indexOf("</numero>")));
                        ligne = ficTexte.readLine();
                    }
                    else if(ligne.startsWith("<editeur>")){
                        editeur = ligne.substring(9,ligne.indexOf("</editeur>"));
                        ligne = ficTexte.readLine();
                    }
                    else if(ligne.startsWith("<description>")){
                       ligne = ficTexte.readLine();
                       temp = "";
                       while(!ligne.equals("</description>")){
                           temp += ligne;
                           ligne = ficTexte.readLine();
                       }
                       if(temp.length() > 255)
                            description = temp.substring(0, 254);
                       else
                           description = temp;
                       ligne = ficTexte.readLine();
                    }
                    else if(ligne.startsWith("<prix>")){
                        temp = ligne.substring(6,ligne.indexOf("</prix>"));
                        prix = Float.valueOf(temp).floatValue();
                        ligne = ficTexte.readLine();
                    }
                    else if(ligne.startsWith("<img>")){
                        temp = ligne.substring(5,ligne.indexOf("</img>"));
                        tab = temp.split(";");
                        img = new ArrayList<String>();
                        for (String i : tab) {
                            img.add(i);
                        }
                        ligne = ficTexte.readLine();
                    }
                    else if(ligne.startsWith("<age>")){
                        temp = ligne.substring(5,ligne.indexOf("</age>"));
                        tab = temp.split(";");
                        a = new ArrayList<age>();
                        for (String i : tab) {
                            a.add(gestionnaireAge.getAgeByName(i));
                        }
                        ligne = ficTexte.readLine();
                    }
                    else if(ligne.startsWith("<categorie>")){
                        temp = ligne.substring(11,ligne.indexOf("</categorie>"));
                        tab = temp.split(";");
                        c = new ArrayList<categorie>();
                        for (String i : tab) {                         
                            c.add(gestionnaireCategorie.getCategorieByName(i));
                        }
                        ligne = ficTexte.readLine();
                    }
                    else if(ligne.startsWith("<tag>")){
                        temp = ligne.substring(5,ligne.indexOf("</tag>"));
                        tab = temp.split(";");
                        t = new ArrayList<tag>();
                        for (String i : tab) {
                            t.add(gestionnaireTag.getTagByName(i));
                        }
                        ligne = ficTexte.readLine();
                    }
                    else if(ligne.startsWith("<note>")){
                        temp = ligne.substring(6,ligne.indexOf("</note>"));
                        note = Float.valueOf(temp).floatValue();
                        ligne = ficTexte.readLine();
                    }
                    else if(ligne.startsWith("<nbvote>")){
                        nbvote = Integer.valueOf(ligne.substring(8,ligne.indexOf("</nbvote>")));
                        ligne = ficTexte.readLine();
                    }
                    else if(ligne.startsWith("<video>")){
                        video = ligne.substring(7,ligne.indexOf("</video>"));
                        ligne = ficTexte.readLine();
                    }
                    else if(ligne.startsWith("<consultation>")){
                        temp = ligne.substring(14,ligne.indexOf("</consultation>"));
                        consultation = Integer.valueOf(temp);
                        ligne = ficTexte.readLine();
                    }

                }while(!ligne.equals("</jeu>"));
                creeJeu(numero, nom, editeur, description, prix, img, a, c, t, note, video, consultation, nbvote);

                ligne = ficTexte.readLine();
                }while(ligne != null);
            }

            ficTexte.close();
        }catch(Exception e){
            System.out.println("erreur");
        }
    }
}
